home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Visual Basic Source Code
/
Visual Basic Source Code.iso
/
vbsource
/
vbmidi
/
vb_seq.bas
< prev
next >
Wrap
BASIC Source File
|
1995-02-04
|
29KB
|
955 lines
Option Explicit
'Type of recorded Midi Message
Type udtMidiMsg
TimeStamp As Long 'Associated time in milliseconds
MidiData As Long 'Usually: (Status + Channel) + (&H100& * Data1) + (&H10000 * Data2)
End Type
'RecBuffer parameters
Global aRecBuffer() As udtMidiMsg 'dynamic array of recorded messages
Global nRecCounter As Long 'N. of recorded messages
Global nRecErrors As Long 'N. of lost Midi In Messages
'Timing variables
Global lInitTime As Long 'timeGetTime() when Play or Rec starts (in Internal Sync)
Global lOffsetTime As Long 'Display Time when Play or Rec starts (in Internal Sync)
'Flags to track Play and Rec activity
Global bStop As Integer 'if True indicates Stop Mode
Global bPlay As Integer 'if True indicates Play Mode
Global bRec As Integer 'if True indicates Rec Mode
'For Clock displaying purposes (incremented by one frame every frame)
Global nDisplayHours As Integer
Global nDisplayMinutes As Integer
Global nDisplaySeconds As Integer
Global nDisplayFrames As Integer
'For MTC Out purposes (incremented by two frames every two frames)
Global nHoursCounter As Integer
Global nMinutesCounter As Integer
Global nSecondsCounter As Integer
Global nFramesCounter As Integer
'Name of the last saved or opened file
Global sFilename As String
'Visualize flags
Global bVisualClock As Integer 'Visualize clock display
Global bVisualData As Integer 'Visualize Midi Data Flow
Global bVisualMtc As Integer 'Visualize MTC flow
'To track Midi flow visualisation
Global lMtcInTime As Long 'Time when MtcIn led was switched on
Global lMtcOutTime As Long 'Time when MtcOut led was switched on
Global lDataInTime As Long 'Time when DataIn led was switched on
Global lDataOutTime As Long 'Time when DataOut led was switched on
'Sequencer parameters
Global nSeqChannel As Integer
Global aSeqProgram(15) As Integer
'Indicates Mouse state in Rewind and Forward MouseDown events
Global bMouseDown As Integer
'Led colors
Global Const LED_OFF = &H80&
Global Const LED_ON = &H80FF&
'GENERAL CONSTANTS
'MousePointer
Global Const DEFAULT = 0
Global Const HOURGLASS = 11
'Keycodes
Global Const KEY_ESCAPE = &H1B
Global Const KEY_NUMPAD0 = &H60
Global Const KEY_RETURN = &HD
Global Const KEY_MULTIPLY = &H6A
Global Const KEY_SPACE = &H20
Global Const KEY_F12 = &H7B
'Special keys
Global Const SHIFT_MASK = 1
Global Const CTRL_MASK = 2
Global Const ALT_MASK = 4
' MsgBox parameters
Global Const MB_OK = 0 ' OK button only
Global Const MB_YESNO = 4 ' Yes and No buttons
Global Const MB_ICONQUESTION = 32 ' Warning query
Global Const MB_ICONEXCLAMATION = 48 ' Warning message
' MsgBox return values
Global Const IDOK = 1 ' OK button pressed
Global Const IDYES = 6 ' Yes button pressed
Global Const IDNO = 7 ' No button pressed
'Colors
Global Const WHITE = &HFFFFFF
Global Const DARKBLUE = &H800000
' DragOver
Global Const ENTER = 0
Global Const LEAVE = 1
Sub Display_Erase ()
If frmVBSeq.lblHours <> "--" Then frmVBSeq.lblHours = "--"
If frmVBSeq.lblMinutes <> "--" Then frmVBSeq.lblMinutes = "--"
If frmVBSeq.lblSeconds <> "--" Then frmVBSeq.lblSeconds = "--"
If frmVBSeq.lblFrames <> "--" Then frmVBSeq.lblFrames = "--"
End Sub
Sub Display_Show ()
Dim sDisplay As String
sDisplay = Format$(nDisplayHours, "00")
If frmVBSeq.lblHours <> sDisplay Then frmVBSeq.lblHours = sDisplay
sDisplay = Format$(nDisplayMinutes, "00")
If frmVBSeq.lblMinutes <> sDisplay Then frmVBSeq.lblMinutes = sDisplay
sDisplay = Format$(nDisplaySeconds, "00")
If frmVBSeq.lblSeconds <> sDisplay Then frmVBSeq.lblSeconds = sDisplay
sDisplay = Format$(nDisplayFrames, "00")
If frmVBSeq.lblFrames <> sDisplay Then frmVBSeq.lblFrames = sDisplay
End Sub
Sub Dlg_Alert (sMsg As String)
Beep
MsgBox sMsg, MB_OK + MB_ICONEXCLAMATION, "ALERT"
End Sub
Function Dlg_YesNo (sMsg1 As String) As Integer
Dim sMsg2 As String
sMsg2 = "Make your decission"
Beep
If MsgBox(sMsg1, MB_YESNO + MB_ICONQUESTION, sMsg2) = IDYES Then
Dlg_YesNo = True
Else
Dlg_YesNo = False
End If
End Function
'Returns True if File must be deleted / False if File must not
Function File_Delete% (sPath As String)
Dim i As Integer
Dim sName As String
Dim FNum As Integer
If Len(sPath) <= 1 Or Mid$(sPath, Len(sPath), 1) = "\" Then
Call Dlg_Alert(sFilename & Chr(10) & "Bad file name!")
frmVBSeq.dlgFileDialog.Filename = "*.SNG"
sFilename = "?"
File_Delete = False
Exit Function
End If
For i = Len(sPath) To 1 Step -1
If Mid$(sPath, i, 1) = "\" Then
sName = Mid$(sPath, i + 1, Len(sPath) - i)
Exit For
End If
Next i
FNum = FreeFile
On Error Resume Next
Open sPath For Input As FNum
'No error -> File already exists
If Err = 0 Then
If Dlg_YesNo(sName & " already exists!" & Chr(10) & "Replace it...?") = True Then
'overwrite it
File_Delete = True
Else
'abort save
File_Delete = False
End If
'File not found
ElseIf Err = 53 Then
'doesn't need to be deleted
'keep on saving
File_Delete = True
'Bad File Name
ElseIf Err = 64 Or Err = 52 Then
Call Dlg_Alert(sName & Chr(10) & "Bad file name!")
frmVBSeq.dlgFileDialog.Filename = "*.SNG"
sFilename = "?"
'abort save
File_Delete = False
'Unexpected error
Else
Call Dlg_Alert("Error #" & Err & Chr(10) & Error$)
frmVBSeq.dlgFileDialog.Filename = "*.SNG"
sFilename = "?"
'abort save
File_Delete = False
End If
Close FNum
End Function
Sub File_Open ()
Dim FNum As Integer
Dim nLen As Integer
Dim i As Integer
'If buffer not empty confirm loss of data
If nRecCounter > 0 Then
If Dlg_YesNo("Erase recorded MIDI messages?") = False Then Exit Sub
End If
On Error GoTo Open_Error_Handler
'Activate cancel error
frmVBSeq.dlgFileDialog.CancelError = True
'Set File Dialog parameters
frmVBSeq.dlgFileDialog.Filter = "Custom MIDI song (*.SNG)|*.SNG|Standard MIDI file (*.MID)|*.MID|All (*.*)|*.*"
frmVBSeq.dlgFileDialog.FilterIndex = 1
frmVBSeq.dlgFileDialog.DialogTitle = "Open File"
frmVBSeq.dlgFileDialog.Action = 1 '1 = Open file dialog
frmVBSeq.Refresh
'Get path and file name to be opened
sFilename = frmVBSeq.dlgFileDialog.Filename
nLen = Len(sFilename)
For i = nLen To 1 Step -1
If Mid$(sFilename, i, 1) = "\" Then Exit For
Next i
sFilename = Right$(sFilename, nLen - i)
Screen.MousePointer = HOURGLASS
If Right$(sFilename, 4) = ".SNG" Then
FNum = FreeFile
Open frmVBSeq.dlgFileDialog.Filename For Input As FNum
Input #FNum, nRecCounter
If nRecCounter > 0 Then
ReDim aRecBuffer(nRecCounter + 1024 - (nRecCounter Mod 1024))
For i = 0 To nRecCounter - 1
Input #FNum, aRecBuffer(i).TimeStamp
Input #FNum, aRecBuffer(i).MidiData
Next i
End If
'Display recorded messages counter
frmVBSeq.lblRecMesNum = CStr(nRecCounter)
Close #FNum
ElseIf Right$(sFilename, 4) = ".MID" Then
Call Dlg_Alert("Not implemented!")
Else
Call Dlg_Alert("Wrong file format!")
End If
Open_Exit:
Screen.MousePointer = DEFAULT
Exit Sub
Open_Error_Handler:
If Err = 32755 Then 'Cancel
Resume Open_Exit
Else
Call Dlg_Alert("Error #" & Err & Chr(10) & Error$)
Close #FNum
Resume Open_Exit
End If
End Sub
Sub File_Save ()
Dim sFname As String
Dim FNum As Integer
Dim i As Integer
Dim nStartName As Integer
Dim nLen As Integer
'Exit if buffer empty
If nRecCounter = 0 Then
Call Dlg_Alert("Nothing to save!")
Exit Sub
End If
On Error GoTo Save_Error_Handler
'Activate cancel error
frmVBSeq.dlgFileDialog.CancelError = True
'Set File Dialog parameters
f